package 代码coding题OR模拟题;

import java.util.HashMap;
import java.util.HashSet;

public class leetcode357统计各位数字中都不同的个数 {
		public static void main(String []args) {
			long t1 = System.currentTimeMillis();
			System.out.println(solution(8));
			long t2 = System.currentTimeMillis();
			System.out.println(t2 -t1);
			long t3 = System.currentTimeMillis();
			System.out.println(solutionOne(8));
			long t4 = System.currentTimeMillis();
			System.out.println(t4 - t3);
			long t5 = System.currentTimeMillis();
			System.out.println(solutionFiall(8));
			long t6 = System.currentTimeMillis();
			System.out.println(t6 - t5);
		}
		/**
		 * 用 hashSet  进行记录的 话 
		 * 9 s 左右
		 * 
		 * @param n
		 * @return
		 */
		public static int solution(int n) {
			int ans = 0;
			/**
			 * 
			 * 从这里 也可以 看出来 
			 * int 可以 自动 转换成 double 
			 * 但是 double 不能 直接 转 int 基础知识对吧
			 */
			int  value = (int)Math.pow(10,n);
//			HashMap<Character,Integer> map = new HashMap<>();
			for(int i = 0 ;i < value ; i++) {
//				HashMap<Character,Integer> map = new HashMap<>();
				HashSet<Character> set = new HashSet<>();
				String s = i + "";
				boolean flag = true;
				for(int j = 0;j < s.length();j++ ) {
					if(set.contains(s.charAt(j))) {
						flag = false;
						break;
//						set.add(s.charAt(j));
					}
					else {
						set.add(s.charAt(j));
					}
				}
				if(flag) {
					ans++;
				}
			}
			return ans;
			
		}
		/**
		 * 用 数组 来record 的话
		 * 6 s 左右
		 * 
		 */
	public static int solutionOne(int n) {
		int ans = 0;
		int  value = (int)Math.pow(10,n);
		for(int i = 0 ;i < value ; i++) {
			int [] map = new int [10];
			String s = i + "";
			boolean flag = true;
			for(int j = 0;j < s.length();j++ ) {
				int  temp= s.charAt(j) - '0';
				if(map[temp] != 0) {
					flag = false;
					break;
//					set.add(s.charAt(j));
				}
				else {
//					set.add(s.charAt(j));
					map[temp] = 1;
				}
			}
			if(flag) {
				ans++;
			}
		}
		return ans;
	}
	/**
	 * 0 ms
	 * 简单的 数学 排列 
	 * 计数 原理 
	 * 组合 问题
	 * @param n
	 * @return
	 */
	public static int solutionFiall(int n) {
		if(n == 0) {
			return 1;
		}
		if(n == 1) {
			return 10;
		}
		int ans =10;
		for(int i = 2;i <= n ;i++) {
			ans += process(i);
		}
		return ans;
		
	}
	public static int process(int num) {
		int ans =9;
		int choice = 9;
		for(int i = 0;i <num -1 ;i++ ) {
			ans *= choice - i;
		}
		return ans;
	}
}
